package cn.xiuxius.embedded.livetemplate;

import com.intellij.codeInsight.template.TemplateActionContext;
import com.intellij.codeInsight.template.TemplateContextType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;

public class GlobalScopeContextType extends TemplateContextType {

    protected GlobalScopeContextType() {
        super("STC_C_CPP_GLOBAL_SCOPE");
    }

    @Override
    public boolean isInContext(@NotNull TemplateActionContext context) {
        PsiFile file = context.getFile();
        String fileName = file.getName().toLowerCase();

        if (!fileName.endsWith(".c") && !fileName.endsWith(".cpp")) {
            return false;
        }

        int offset = context.getStartOffset();
        PsiElement element = file.findElementAt(offset);
        if (element == null) return false;

        // 在函数体内，返回 false（不属于全局）
        return !isInFunctionBody(element);
    }

    private boolean isInFunctionBody(PsiElement element) {
        while (element != null) {
            // 先尝试判断这个元素是不是大括号块
            if (isCurlyBraceBlock(element)) {
                // 判断该大括号块是否属于函数体
                if (belongsToFunction(element)) {
                    // 光标在函数体块内
                    return true;
                }
            }
            element = element.getParent();
        }
        return false;
    }

    private boolean isCurlyBraceBlock(PsiElement element) {
        String text = element.getText();
        if (text == null) return false;
        text = text.trim();
        return text.startsWith("{") && text.endsWith("}");
    }

    private boolean belongsToFunction(PsiElement blockElement) {
        PsiElement prevSibling = blockElement.getPrevSibling();
        // 简单向前找函数签名的尾部，函数定义大多是：`<return_type> name(params) { body }`
        // 这里粗略判断前一个兄弟元素文本是否包含`)`
        while (prevSibling != null) {
            String text = prevSibling.getText();
            if (text != null && text.contains(")")) {
                return true;
            }
            // 跳过空白或者注释
            prevSibling = prevSibling.getPrevSibling();
        }
        return false;
    }
}
